/**
 * 判断非空值
 *
 * @param value 被判断的值
 * @return true 表示不为 null 也不为 undefined
 * */
function isNotNull(value) {
    return value !== null && value !== undefined;
}
/**
 * 判断空值
 *
 * @param value 被判断的值
 * @return true 表示为 null 或 undefined
 * */
function isNull(value) {
    return !isNotNull(value);
}
/**
 * 判断是否存在空值
 *
 * @param values 被判断的值，不定长列表
 * @return true 表示包含 null 或 undefined
 * */
function hasNull(...values) {
    for (let value in values) {
        if (isNull(value)) {
            return true;
        }
    }
    return false;
}
/**
 * 判断空字符串
 *
 * @param value 被判断的值
 * @return true 表示不为 null 或 undefined 或空字符串
 * */
function isNotEmpty(value) {
    return value !== null && value !== undefined && value !== '';
}
/**
 * 判断非空字符串
 *
 * @param value 被判断的值
 * @return true 表示为 null 或 undefined 或空字符串
 * */
function isEmpty(value) {
    return !isNotEmpty(value);
}
/**
 * 判断是否存在空字符串
 *
 * @param values 被判断的值，不定长列表
 * @return true 表示包含 null 或 undefined 或空字符串
 * */
function hasEmpty(...values) {
    for (let value in values) {
        if (isEmpty(value)) {
            return true;
        }
    }
    return false;
}
/**
 * 生成len位随机字符串
 *
 * @param len 随机字符串位数，范围在1 ~ 36之间，默认为18
 * @return string 随机字符串
 * */
export function randomStr(len = 18) {
    // 随机一个小数，并将其转为36进制字符
    let result = Math.random().toString(36);
    // 消除所有点符号
    result = result.replaceAll('.', '');
    // 截取后len位字符串并返回: len不小于1且不超过36
    len = Math.max(len, 1);
    len = Math.min(len, 36);
    return result.slice(-len);
}
/*
 * 日期字符串处理：1999-01-02T12:12:12 -> 1999年01月02日 12:12
 *
 * @param dateStr 日期字符串
 * @return 格式化后的日期字符串
 * */
export function dateFormat(dateStr) {
    // 用于将六大元素处理为两位数格式（年除外）
    function toDouble(e) {
        return e < 10 ? '0' + e : e;
    }
    // 将日期字符串转为日期格式
    let date = new Date(dateStr);
    // 获取日期中的元素: 年，月，日，时，分
    let yy = toDouble(date.getFullYear());
    let mm = toDouble(date.getMonth() + 1);
    let dd = toDouble(date.getDate());
    let hh = toDouble(date.getHours());
    let mi = toDouble(date.getMinutes());
    // 返回美化后的日期字符串
    return `${yy}年${mm}月${dd}日 ${hh}:${mi}`;
}
/**
 * 带按钮的确认弹框
 *
 * @param content 弹框内容
 * @param onConfirm 确认时的回调函数
 * @param onCancel 取消时的回调函数
 */
function confirm(content, onConfirm, onCancel) {
    wx.showModal({
        title: '提示',
        content: content,
        success: function (sm) {
            if (sm.confirm && onConfirm) onConfirm();
            if (sm.cancel && onCancel) onCancel();
        }
    });
}
/**
 * 跳转到另一个标签页或普通页
 *
 * @param type 切换类型，可选标签页面 tab 或 普通页面 page
 * @param url 目标页面地址
 * @param reload 是否重新加载目标页面，默认true
 */
function to(type, url, reload = true) {
    // 执行目标页面的 onload() 方法
    function reloadTarget() {
        if (reload) {
            let page = getCurrentPages().pop();
            if (page) page.onLoad();
        }
    }
    if ('tab' === type) {
        wx.switchTab({url: url, success: () => reloadTarget()});
    } else if ('page' === type) {
        wx.navigateTo({url: url, success: () => reloadTarget()});
    } else {
        console.error('跳页类型有误', 'type: ' + type);
    }
}
/**
 * 微信提示框
 *
 * @param title 提示文字，不能超过7个字，普通类型除外
 * @param icon 提示图标
 * @param duration 提示文字持续的时间
 * @param err 异常信息
 */
function wxToast(title, icon, duration, err) {
    if (err) console.error(err)
    wx.showToast({title, icon, duration});
}
/**
 * 微信模态框
 *
 * @param title 提示文字
 * @param content 提示内容
 * @param success 用户点击确定后的回调函数
 * @param cancel 用户点击取消后的回调函数
 */
function wxModal(title, content, success, cancel) {
    wx.showModal({
        title: title,
        content: content,
        success: function (res) {
            if (res.confirm) {
                if (success) success();
            } else {
                if (cancel) cancel();
            }
        }
    });
}
/**
 * 判断用户是否登录
 *
 * @returns {boolean} false未登录，true已登录
 */
function isLogin() {
    if (!wx.getStorageSync('token')) {
        this.error('请先登录');
        setTimeout(() => {
            this.page('/pages/login/login-by-account/login-by-account', false);
        }, 500);
        return false;
    }
    return true;
}
/**
 * 随机生成一个十六进制的颜色值
 *
 * @returns {string} 十六进制的颜色值如 '#000000'
 */
function getRandomColor() {
    const rgb = []
    for (let i = 0; i < 3; ++i) {
        let color = Math.floor(Math.random() * 256).toString(16)
        color = color.length === 1 ? '0' + color : color
        rgb.push(color)
    }
    return '#' + rgb.join('')
}
// 导出模块
module.exports = {
    isNotNull, isNull, isEmpty, isNotEmpty, hasNull, hasEmpty, randomStr,
    dateFormat, confirm, isLogin, getRandomColor,
    tab: (url, reload) => to('tab', url, reload),
    page: (url, reload) => to('page', url, reload),
    success: (title) => wxToast(title, 'success', 2000),
    error: (title, err) => wxToast(title, 'error', 2000, err),
    tip: (title) => wxToast(title, 'none', 2000),
    modal: (title, content, success, cancel) => wxModal(title, content, success, cancel),
}
